# -*- coding: utf-8 -*-
# @Time : 2022-04-02 17:03
# @Author : Z
# @Function : 装饰器  decotator
import json
import time


def add(a, b):
    start_time = time.time()
    res = a + b
    exec_time = time.time() - start_time
    print("add函数，花费的时间是：{}".format(exec_time))
    print(add.__closure__)
    return res


# add(10000, 2)


# 定义装饰器，将计算时间部分独立出来，由装饰器完成
"""
闭包就是能够读取其他函数内部变量的函数。
例如在大部分编程语言中，只有函数内部的子函数才能读取局部变量，所以闭包可以理解成“定义在一个函数内部的函数“。
在本质上，闭包是将函数内部和函数外部连接起来的桥梁。
一句话说就是，在函数中再嵌套一个函数，并且引用外部函数的变量，这就是一个闭包了
"""
def time_calc(func):
    #
    def wrapper(*args, **kwargs):
        start_time = time.time()
        res = func(*args, **kwargs)
        time.sleep(0.5)
        exec_time = time.time() - start_time
        print(func.__name__, "函数花费的时间是：", exec_time)
        return res

    return wrapper


"""
在一个函数上面添加修饰符 @另一个函数名 的作用是将这个修饰符下面的函数作为该修饰符函数的参数传入
如果被@的函数是一个闭包函数，那么就把被修饰函数的参数传给闭包的内函数，
结合位置参数列表args和可变参数字典kwargs，就可以完成所有参数的接收，结合闭包，就可以实现函数装饰器了。
"""
@time_calc
def add1(a, b):
    return a + b

a = add1(1, 2)
print(a)


#
# @time_calc
# def sub(a, b):
#     return a - b
#
#



#
#
# # b= sub(1,2)
# # print(b)
#
# # 闭包的特点就是内部函数引用了外部函数中的变量
# def func():
#     name = "python"
#
#     def inner():
#         print(name)
#         return name
#
#     # 函数名.__closure__在函数是闭包函数时，返回一个cell元素；不是闭包时，返回None。
#     print(inner.__closure__)
#     return inner
#
#
# f = func()
# a = f()
# print(a)


# # 闭包函数的实例
# # outer是外部函数 a和b都是外函数的临时变量
# def outer(a):
#     b = 10
#
#     # inner是内函数
#     def inner():
#         # 在内函数中 用到了外函数的临时变量
#         print(a + b)
#         return a + b
#
#     # 外函数的返回值是内函数的引用
#     return inner
#
#
# # 此时外函数两个临时变量 a是5 b是10 ，并创建了内函数，然后把内函数的引用返回存给了a
# ll = outer(5)
# a = ll()
# print(a)


a = '{"a":"1"}'
b = json.loads(a)
print(b)
print(type(b))